/**
 * @(#)com.tansun.easycare.rule.excel.utils.ExcelUitl.java Copyright (c) 2017 天阳宏业科技股份有限公司
 */
package com.tansun.easycare.rule.excel.utils;

import java.text.DecimalFormat;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;

import org.apache.poi.ss.usermodel.Cell;

import com.tansun.easycare.modules.sys.utils.UserUtils;
import com.tansun.easycare.rule.common.entity.RuleBaseEntity;
import com.tansun.easycare.rule.datamodel.entity.RuleDataDomain;
import com.tansun.easycare.rule.datamodel.entity.RuleDataparams;
import com.tansun.rule.utils.StringUtils;

/**
 * Excel工具类
 * @author zengdong
 * @version 1.0  2017年5月22日
 * @modified zengdong  2017年5月22日  <创建>
 */
public class ExcelUitl {

    /**
     * 格式化数据
     */
    private static final DecimalFormat DECFORMAT = new DecimalFormat("#.##");

    /**
     * 获取Excel表格元素内容
     * @param cell
     * @return
     */
    public static String getStringCellValue(Cell cell) {
        if (cell == null) {
            return "";
        }
        int type = cell.getCellType();
        if (type == Cell.CELL_TYPE_BLANK) {
            return "";
        } else if (type == Cell.CELL_TYPE_STRING) {
            return cell.getStringCellValue();
        } else if (type == Cell.CELL_TYPE_NUMERIC) {
            double val = cell.getNumericCellValue();
            int i = (int) val;
            if (val - i > 0) {
                return val + "";
            } else {
                return DECFORMAT.format(val);
            }

        } else if (type == Cell.CELL_TYPE_BOOLEAN) {
            return cell.getBooleanCellValue() + "";
        }
        return "";
    }

    /**
     * 创建人、更新人、创建时间、更新时间的初始化
     * @param date
     */
    public static void dataEntitySet(RuleBaseEntity entity, Date date,String userId) {
        if (date == null) {
            date = new Date();
        }

        entity.setCreateBy(userId);
        entity.setCreateDate(date);
        entity.setUpdateBy(userId);

        entity.setUpdateDate(date);
    }

    /**
     * 将首字母大写其余小写
     * @param name
     * @return
     */
    public static String conversionStr(String name) {
        if (StringUtils.isNotBlank(name)) {
            name = name.toLowerCase();
            char[] cs = name.toCharArray();
            cs[0] -= 32;
            return String.valueOf(cs);
        }
        return name;
    }

    /**
     * 过滤值
     * @return
     */
    public static String filterValue(String dataValue, String dataType, String contentType, String... other) {
        String returnVal = "";
        if("BOOLEAN".equals(dataType.toUpperCase())){
                if ("0".equals(dataValue)) {
                    returnVal = "否";
                } else {
                    returnVal = "是";
                }
        }else if("DATE".equals(dataType.toUpperCase())){

                if (other != null && "in".equals(contentType)) {

                    if (other[1] != null && other[2] != null) {

                        returnVal = other[1] + dataValue + other[2];
                    }
                } else {
                    returnVal = dataValue;
                }

        }else if("DOUBLE".equals(dataType.toUpperCase())||"BIGDECIMAL".equals(dataType.toUpperCase())){
                if (other != null && "in".equals(contentType)) {
                    if (other[1] != null && other[2] != null) {
                        if("==".equals(other[1])) {
                            returnVal="@"+dataValue + other[2];
                        }else if("!=".equals(other[1])) {
                            returnVal="#"+dataValue + other[2];
                        }else {
                            returnVal = other[1] + dataValue + other[2];
                        }

                    }
                } else {
                    returnVal = dataValue;
                }
        }else if("LONG".equals(dataType.toUpperCase())||"BIGINTEGER".equals(dataType.toUpperCase())){
                if (other != null && "in".equals(contentType)) {

                    if (other[1] != null && other[2] != null) {
                        if("==".equals(other[1])) {
                            returnVal="@"+dataValue + other[2];
                        }else if("!=".equals(other[1])) {
                            returnVal="#"+dataValue + other[2];
                        }else {
                            returnVal = other[1] + dataValue + other[2];
                        }
                    }
                } else {
                    returnVal = dataValue;
                }
        }else if("STRING".equals(dataType.toUpperCase())){
			if("in".equals(contentType.toLowerCase())){
				if("!=".equals(other[1])){
					returnVal = other[1] + dataValue;
				}else{
					returnVal = dataValue;
				}
			}else{
                returnVal = dataValue;
			}
        }else if("EMUN".equals(dataType.toUpperCase())){
//			if(other != null && other.length == 3){
//				returnVal = ParamsUtil.getDomainById(other[0],dataValue);
//			}
                returnVal = new ParamsUtil().getDomainById(other[0], dataValue);
        }
        return returnVal;
    }

    /**
     * 数据值校验
     * @param value
     * @param params
     * @param msg
     */
    public static String verificationValue(String value, RuleDataparams params, String contentType, List<RuleDataDomain>... list) {
        String errorMsg = "";
        if("out".equals(contentType) && StringUtils.isEmpty(value)) {//输出变量存在空值则提示
            return "参数值为空";
        }
        //输入变量存在空值时，
        /*if ("in".equals(contentType) && StringUtils.isEmpty(value) && (!"LONG".equals(params.getType()) && !"DOUBLE".equals(params.getType())) ) {
            return "参数值为空";
        }*/
        if (params != null && StringUtils.isNotBlank(value)) {
            String type = params.getType().toUpperCase();
			if ("BOOLEAN".equals(type)) {
				if (!("是".equals(value) || "否".equals(value))) {
					errorMsg = "参数值只能为“是”或者为“否”";
				}
			} else if ("DATE".equals(type)) {

			} else if ("DOUBLE".equals(type)) {
				errorMsg = verificationNumber(value, params, contentType);
			} else if ("LONG".equals(type)) {
				errorMsg = verificationNumber(value, params, contentType);
			} else if ("STRING".equals(type)) {

			} else if ("EMUN".equals(type)) {
				if (list != null && list.length > 0) {
					List<RuleDataDomain> domainList = list[0];
					String[] str = value.split(",|，");
					if (str != null && str.length > 0) {
						String msg = "";
						for (String s : str) {
							boolean flag = false;
							for (RuleDataDomain domain : domainList) {
								if (domain.getName().toLowerCase().equals(s.toLowerCase())) {
									flag = true;
									break;
								}
							}
							if (!flag) {
								msg += "," + s;
							}
						}
						if (StringUtils.isNotEmpty(msg)) {
							errorMsg = "参数值" + msg.substring(1) + "与数据模型不匹配";
						}
					}
				}
			}
        }
        return errorMsg;
    }

    private static String verificationNumber(String value, RuleDataparams params, String contentType) {
        if (StringUtils.isNotBlank(contentType) && "out".equals(contentType)) {
            if (!isNumber(value)) {
                return "参数值请输入数字";
            }
        } else {
            if (!(value.indexOf("[") != 0 || value.indexOf("(") != 0)
                    || !(value.indexOf("]") != (value.length() - 1) || value.indexOf(")") != (value.length() - 1))
                    || value.indexOf(",") < 0) {
                return "参数值请使用“[、(、)、]”符号好产生一个区间值";
            }
            String[] doubleArr = value.substring(1, value.length() - 1).split(",|，");
            String[] limitArr = null;
            if (!StringUtils.isEmpty(params.getDomain())) {
                limitArr = params.getDomain().substring(1, params.getDomain().length() - 1).split(",");
            }
            for (String str : doubleArr) {
                if (!isNumber(str) && !"".equals(str))
                    return "参数值请输入数字";
                if (limitArr != null && !StringUtils.isEmpty(params.getDomain()) && !validateSectionVal(str, limitArr)) {
                    return "参数值请输入在" + params.getDomain() + "区间的值";
                }
            }
            if (doubleArr.length == 2) {
                if("".equals(doubleArr[0]) && "".equals(doubleArr[1]) ){
                    return "参数值请输入数字";
                }
                if(!(  ("".equals(doubleArr[0]) && !"".equals(doubleArr[1]))
                        || ("".equals(doubleArr[1]) && !"".equals(doubleArr[0])))){
                    if (Float.parseFloat(doubleArr[0]) > Float.parseFloat(doubleArr[1])) {
                        return "起始值不能大于结束值";
                    }
                }

            }
//			else{
//				return "参数值存在多个逗号";
//			}
        }
        return "";
    }

    public static String[] parseControlValue(String controlValue) {
        String leftOpt = "";
        String rightOpt = "";
        String conValue = controlValue;
        if (conValue != null && conValue.length() > 2) {
            int idx = conValue.indexOf("(");
            int idd = conValue.indexOf("@");//数值类型的输入变量当输入值的符号为:"=="时
            int idn = conValue.indexOf("#");//数值类型的输入变量当输入值的符号为:"!="时
            if (idx > -1 && idd == -1 && idn==-1) {
                leftOpt = "(";
            }else if(idx == -1 && idd > -1 && idn == -1) {
                leftOpt = "==";
            }else if(idx == -1 && idd == -1 && idn > -1) {
                leftOpt = "!=";
            }else {
                idx = conValue.indexOf("[");
                if (idx > -1) {
                    leftOpt = "[";
                }
            }
            String upStr = "";
            if (idx > -1) {
                upStr = conValue.substring(idx + 1);
            }else if(idd >-1) {
                upStr = conValue.substring(idd + 1);
            }else if(idn >-1) {
                upStr = conValue.substring(idn + 1);
            }
            idx = upStr.indexOf(")");
            if (idx > -1) {
                rightOpt = ")";
            } else {
                idx = upStr.indexOf("]");
                if (idx > -1) {
                    rightOpt = "]";
                }

            }
            if (idx > 1) {
                upStr = upStr.substring(0, idx);

            }
            String[] result = new String[3];
            result[0] = leftOpt;
            result[1] = upStr;
            result[2] = rightOpt;
            return result;


        }
        return null;
    }

    /**
     * 判断是否为数字
     * @param number
     * @return
     */
    private static boolean isNumber(String number) {
        Pattern pattern = Pattern.compile("^(-?\\d+)(\\.\\d+)?$");
        return pattern.matcher(number).matches();
    }

    /**
     * 判断区间
     * @param controlVal
     * @param limitArr
     * @return
     */
    private static boolean validateSectionVal(String controlVal, String[] limitArr) {
        float v = Float.parseFloat(controlVal);
        for (int i = 0; i < limitArr.length; i++) {
            if (i == 0 && !StringUtils.isEmpty(limitArr[i]) && v < Float.parseFloat(limitArr[i])) {
                return false;
            }
            if (i == 1 && !StringUtils.isEmpty(limitArr[i]) && v > Float.parseFloat(limitArr[i])) {
                return false;
            }
        }
        return true;
    }


}
